package com.alibaba.filter;

import com.alibaba.fastjson.JSON;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Component
public class MyFilter extends ZuulFilter {
    /**
     * 设置过滤器类型
     *
     * 应该用的是pre filter
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /*
    设置执行顺序 数字越小 优先级越高
     */
    @Override
    public int filterOrder() {
        return 0;
    }
    /**
     * 判断是否需要执行run方法
     * 如果返回的是true  则执行run 方法 进行拦 截
     * false  不执行  则放行
     * @return
     */
    @Override
    public boolean shouldFilter() {
        //获取请求对象
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        String uri = request.getRequestURI();
        if (uri.endsWith("login")||uri.endsWith("register")||uri.endsWith("static")){
            return false;
        }
        return true;
    }

    /**
     * filter的核心方法
     * 只有当shouldFilter返回true  才会被执行
     * @return
     * @throws ZuulException
     */

    @Override
    public Object run() throws ZuulException {
        /**
         * 1.要拿到header里面的token的值(先拿到request  在通过request拿到header)
         * 2.判断有没有值   如果没有就应该被拦截   如果有值 那么就走判断token是否有效的逻辑
         * 3.返回结果写入response
         * 4.拦截
         */
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        HttpServletResponse response = RequestContext.getCurrentContext().getResponse();
        String token = request.getHeader("token");
        if(StringUtils.isBlank(token)||tokenIsValid("token")){
            //创建返回的对象
            Map result = new HashMap();
            result.put("code",5000);
            result.put("success",false);
            result.put("message","token 有问题");
            String jsonResult = JSON.toJSONString(result);

            try {
                response.setContentType("application/json,charset=utf8");
                //将返回对象写入response中
                response.getWriter().print(jsonResult);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //拦截
            //setSendZuulResponse这个方法  强行记忆
            RequestContext.getCurrentContext().setSendZuulResponse(false);
        }
        //不要问为什么是返回的null
        //官方文档说请忽略
        return null;
    }

    /**
     * 判断token是否有效(抽取出来的公共方法)
     * @return
     */

    private boolean tokenIsValid(String token){
        return false;
    }

}
